﻿using AspNetMVCTodo.Models;
using AspNetMVCTodo.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Mvc;

namespace AspNetMVCTodo.Controllers
{
    [Authorize]
    public class TodoController: Controller
    {
        private readonly ITodoItemService _todoItemService;
        private readonly UserManager<ApplicationUser> _userManager;     //UserManager 包含在 ASP.NET Core Identity 里。 IdentityUser 类 对应 AspNetUsers 表

        public TodoController(ITodoItemService todoItemService, UserManager<ApplicationUser> userManager)
        {
             _todoItemService = todoItemService;
            _userManager = userManager;
        }

        // action 名为 Index 的可以在 URL 中省略
        // 一个 action 方法可以返回视图、JSON数据，或者 200 OK和404 Not Found 之类的状态码。返回类型 IActionResult 可以返回前面任意一个。
        public async Task<IActionResult> IndexAsync()
        {
            var currentUser = await _userManager.GetUserAsync(User);            //用 UserManager 从 User 属性中获取当前登录的用户 —— 该属性在当前的 action 中有效。
            if (currentUser == null)                                            //如果当前用户已经登录， User 属性就持有一个有效的轻量级的对象。
            {
                return Challenge();                                             //可以用 Challenge() 方法强制用户再次登录：
            }

            var items = await _todoItemService.GetIncompleteItemsAsync(currentUser);
            var model = new Models.TodoViewModel()
            {
                Items = items
            };
            return View(model);
        }
        // "返回一个 Task" 的意思是说，该方法不能立刻给出一个结果，但是你可以使用关键字 await，以确保你的代码暂停，直到结果就绪才继续执行。



        [ValidateAntiForgeryToken]    //用于防止跨站请求伪造（CSRF）攻击。这个属性通常用于标记那些需要验证反伪造令牌的控制器方法或操作。
        public async Task<IActionResult> AddItem(TodoItem newItem)
        {
            //ASP.NET Core 还进行了 模型核验操作（model validation）。核验操作检查从传入请求绑定到模型的数据，鉴别其合理性和有效性。
            if (!ModelState.IsValid)
            {
                // 重定向回 Index 视图
                return RedirectToAction("Index");
            }

            var currentUser = await _userManager.GetUserAsync(User);
            if (currentUser == null) return Challenge();

            var successful = await _todoItemService.AddItemAsync(newItem, currentUser);
            if (!successful)
            {
                // 处理添加失败的情况，例如显示错误消息
                return BadRequest(new { error = "Could not add item." });
            }

            return RedirectToAction("Index");
        }


        public async Task<IActionResult> MarkDone(Guid id)
        {
            if (id == Guid.Empty)
            {
                return RedirectToAction("Index");
            }

            var currentUser = await _userManager.GetUserAsync(User);
            if (currentUser == null) return Challenge();

            var successful = await _todoItemService.MarkDoneAsync(id, currentUser);
            if (!successful)
            {
                return BadRequest("Could not mark item as done.");
            }

            return RedirectToAction("Index");
        }
    }
}
